import http from '@ohos.net.http';
import { Response } from './Response';
import { ContentType, buildFormData } from '../util/HttpConfig';
import HashMap from '@ohos.util.HashMap';
import deviceInfo from '@ohos.deviceInfo';

/**
 * info：网络请求
 */
export async function request<T>(url: string, method?: http.RequestMethod, contentType?: ContentType, extraData?: Object, headerData?: HashMap<string, Object>): Promise<Response<T>> {
  // 响应数据
  return new Promise<Response<T>>((resolve, reject) => {

    // 每个httpRequest对应一个http请求，不可复用
    let httpRequest = http.createHttp();
    // 用于订阅HTTP响应头，此接口会比request请求先返回。可以根据业务需要订阅此消息
    // 从API 8开始，使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
    httpRequest.on('headersReceive', (header) => {
      // console.info('header: ' + JSON.stringify(header));
    });
    //构建请求参数
    let formData = buildFormData(url, extraData, contentType, headerData)

    httpRequest.request(formData.url, {
      // 请求方式
      // method: http.RequestMethod.POST,
      method: method ? method : http.RequestMethod.GET,
      // header: headerData ? headerData : new Herder,
      header: formData.header,
      // // GET请求 extraData 属性不生效
      // extraData: extraData,
      extraData: formData.body,
      // extraData: 'phone=13923336173&passwd=12345',
      // 设置返回数据的类型，默认为字符串 OBJECT：对象类型 ARRAY_BUFFER：二进制数组类型
      expectDataType: http.HttpDataType.STRING,
      // // 可选，默认为true
      usingCache: true,
      // // 可选，默认为1
      priority: 1,
      // // 可选，默认为60000ms
      connectTimeout: 60000,
      // // 可选，默认为60000ms
      readTimeout: 60000,
      // // 可选，协议类型默认值由系统自动指定
      usingProtocol: http.HttpProtocol.HTTP1_1
    }, (err, data) => {
      if (!err) {
        console.info('requestApiTag http api 成功:' + url.replace('http://', ''));
        // data.result为HTTP响应内容，可根据业务需要进行解析
        console.info('requestApiTag Result:' + JSON.stringify(data.result));
        console.info('requestApiTag code:' + JSON.stringify(data.responseCode));
        // data.header为HTTP响应头，可根据业务需要进行解析
        console.info('requestApiTag header:' + JSON.stringify(data.header));
        console.info('requestApiTag cookies:' + JSON.stringify(data.cookies)); // 8+
        // 取消订阅HTTP响应头事件
        httpRequest.off('headersReceive');
        // 当该请求使用完毕时，调用destroy方法主动销毁
        httpRequest.destroy();

        if (data.resultType == http.HttpDataType.ARRAY_BUFFER) {
          resolve(data.result as Response<T>)
        } else if (data.resultType == http.HttpDataType.STRING) {
          let res: Response<T> = JSON.parse(data.result.toString())
          if (res.code == 0 || res.code == 1) {
            resolve(res)
          } else {
            if (res.message) {
              reject(res.message)
            } else if (res.msg) {
              reject(res.msg)
            } else {
              reject("未知错误")
            }
          }
        } else {
          reject("不支持的返回值类型")
        }
      } else {
        console.info('requestApiTag http api 错误:' + JSON.stringify(err));
        // 取消订阅HTTP响应头事件
        httpRequest.off('headersReceive');
        // 当该请求使用完毕时，调用destroy方法主动销毁。
        httpRequest.destroy();
        reject(err)
      }
    });

  })

}
